package com.zust.response;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.zust.enums.ResultEnum;
import lombok.Getter;

import java.io.Serializable;

/**
 * Created on 2018/3/15.
 * 统一的服务响应对象
 * 返回数据时忽略为null的属性
 * @author Jie
 */
@JsonInclude(JsonInclude.Include.NON_NULL)
@Getter
public class ServerResponse<T> implements Serializable {

    /**
     * 状态码
     */
    private Integer status;

    /**
     * 消息
     */
    private String msg;

    /**
     * 需要传递的数据
     */
    private T data;

    /**
     * 私有的构造方法
     * @param resultEnum 结果枚举
     */
    private ServerResponse(ResultEnum resultEnum) {
        this.status = resultEnum.getCode();
        this.msg = resultEnum.getMessage();
    }

    /**
     * 私有的构造方法
     * @param resultEnum 结果枚举对象
     * @param data  需要返回的数据
     */
    private ServerResponse(ResultEnum resultEnum, T data) {
        this.status = resultEnum.getCode();
        this.msg = resultEnum.getMessage();
        this.data = data;
    }

    /**
     * 创建成功的响应,只有状态码以及消息,不包含数据
     * @return 响应对象实例
     */
    public static ServerResponse createBySuccess(){
        return new ServerResponse(ResultEnum.SUCCESS);
    }

    /**
     * 创建成功的响应
     * @param data  需要传递的数据
     * @param <T> 传递数据的数据类型
     * @return 响应对象实例
     */
    public static<T> ServerResponse<T> createBySuccess(T data){
        return new ServerResponse<T>(ResultEnum.SUCCESS,data);
    }

    /**
     * 创建错误响应,当前错误为模糊错误,没有指定详细的错误状态
     * @return 响应对象实例
     */
    public static ServerResponse createByError(){
        return new ServerResponse(ResultEnum.ERROR);
    }

    /**
     * 创建错误响应,当前错误通过枚举来指定详细错误代码
     * @return 响应对象实例
     */
    public static ServerResponse createByError(ResultEnum resultEnum){
        return new ServerResponse(resultEnum);
    }
}
